﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Data;
using Domain.Util;
using Domain.Model;

namespace BelDecor.Net.Pages
{
    public partial class Pedido : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ValidaSeguranca("Pedido");

                PopulaClientes();

                if (Request.QueryString["idCliente"] != null)
                {
                    ddlCliente.SelectedValue = Request.QueryString["idCliente"].ToString();
                }

                if (!string.IsNullOrEmpty(Request["idPedido"]))
                {
                    hdfIdPedido.Value = Request["idPedido"].ToString();
                    PopulaPedido(int.Parse(hdfIdPedido.Value));

                }
                else
                {
                    this.txtCodigoaPedido.Text = Util.Numerador("codigoPedido");
                }
            }
        }

        protected void grdProduto_ItemUpdated(object source, Telerik.Web.UI.GridUpdatedEventArgs e)
        {

        }

        protected void grdProduto_ItemInserted(object source, GridInsertedEventArgs e)
        {


        }

        protected void grdProduto_ItemDeleted(object source, GridDeletedEventArgs e)
        { }

        protected void RadioCheckedChanged(object sender, System.EventArgs e)
        {
        }

        protected void grdProduto_DataBound(object sender, EventArgs e)
        { }


        //void PopulaProdutos(int idPedido, bool rebind = true)
        //{
        //    var lstProdutos = VwProdutoPedido.All().Where(p => p.Id_Pedido == idPedido);
        //    grdProduto.DataSource = lstProdutos;
        //    if (rebind) grdProduto.DataBind();
        //}

        void PopulaPedido(int idPedido)
        {
            //pedido
            var pedido = Domain.Model.Pedido.SingleOrDefault(p => p.Id_Pedido == idPedido);

            if (pedido != null)
            {
                AplicaCalculoPedido(pedido.Id_Pedido);
                txtCodigoaPedido.Text = pedido.CodigoPedido.ToString();
                ddlCliente.SelectedValue = pedido.IdCliente.ToString();
                //txtDataCadastro.SelectedDate = pedido.dataCadastro;
                txtDataVencimento.SelectedDate = pedido.dataVencimento;
                txtObservacoes.Text = pedido.observacoes;

                if (pedido.ValorTotal != null)
                {
                    txtValorTotal.Value = (double)pedido.ValorTotal;
                }
            }

            //produto
            PopulaProdutos(idPedido);

            //serviços
            PopulaServicos(idPedido);
        }

        void PopulaClientes()
        {
            List<Domain.Model.VwCliente> data = GetData("");

            for (int i = 0; i < data.Count; i++)
            {
                ddlCliente.Items.Add(new RadComboBoxItem(data[i].nome.ToString(), data[i].id.ToString()));
            }
        }

        protected void ddlCliente_ItemsRequested(object sender, RadComboBoxItemsRequestedEventArgs e)
        {
            List<Domain.Model.VwCliente> data = GetData(e.Text);

            int itemOffset = e.NumberOfItems;
            int endOffset = Math.Min(itemOffset + 10, data.Count);
            e.EndOfItems = endOffset == data.Count;

            for (int i = itemOffset; i < endOffset; i++)
            {
                ddlCliente.Items.Add(new RadComboBoxItem(data[i].nome.ToString(), data[i].id.ToString()));
            }

            e.Message = GetStatusMessage(endOffset, data.Count);
        }

        protected void drop_ItemsRequested(object sender, RadComboBoxItemsRequestedEventArgs e)
        {

            List<Domain.Model.Produto> data = GetProdutos(e.Text);

            int itemOffset = e.NumberOfItems;
            int endOffset = Math.Min(itemOffset + 10, data.Count);
            e.EndOfItems = endOffset == data.Count;

            for (int i = itemOffset; i < endOffset; i++)
            {
                ddlCliente.Items.Add(new RadComboBoxItem(data[i].nome.ToString(), data[i].Id_Produto.ToString()));
            }

            e.Message = GetStatusMessage(endOffset, data.Count);

        }

        private static string GetStatusMessage(int offset, int total)
        {
            if (total <= 0)
                return "Sem resultado";

            return String.Format("Items <b>1</b>-<b>{0}</b> out of <b>{1}</b>", offset, total);
        }

        private static List<Domain.Model.VwCliente> GetData(string text)
        {
            var lstCliente = Domain.Model.VwCliente.All().Where(c => (text.Trim().Length > 0 ? c.nome.Contains(text.Trim()) : true)).ToList();
            return lstCliente;
        }



        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            int idPedido = 0;
            try
            {
                int.TryParse(hdfIdPedido.Value, out idPedido);

                if (idPedido == 0)
                {
                    //inclusão
                    var objPedido = new Domain.Model.Pedido();

                    objPedido.CodigoPedido = this.txtCodigoaPedido.Text;

                    if (!string.IsNullOrEmpty(ddlCliente.SelectedValue))
                    {
                        objPedido.IdCliente = int.Parse(ddlCliente.SelectedValue);
                    }

                    objPedido.dataCadastro = DateTime.Now;

                    if (txtDataVencimento.SelectedDate != null)
                    {
                        objPedido.dataVencimento = txtDataVencimento.SelectedDate;
                    }

                    objPedido.observacoes = txtObservacoes.Text;

                    if (txtValorTotal.Value != null)
                        objPedido.ValorTotal = (decimal)txtValorTotal.Value;

                    objPedido.Save();

                    Domain.Model.StatusPedido statusPedido = new StatusPedido();

                    var status = Domain.Model.Status.SingleOrDefault(s => s.P_status == "Pendente");

                    //////////////////////////////////
                    //inclui status do pedido
                    statusPedido.Id_Pedido = objPedido.Id_Pedido;
                    statusPedido.Id_Status = status.Id_Status;
                    statusPedido.data = DateTime.Now;
                    statusPedido.motivo = "Inclusão do pedido no sistema";
                    statusPedido.Save();

                    //inclui pedido em contas a receber
                    var contaReceber = new Domain.Model.ContaReceber();

                    contaReceber.Id_Pedido = objPedido.Id_Pedido;
                    contaReceber.Save();

                    AplicaCalculoPedido(objPedido.Id_Pedido);

                }
                else
                {
                    //edição
                    var objPedido = Domain.Model.Pedido.SingleOrDefault(p => p.Id_Pedido == idPedido);

                    if (ddlCliente.SelectedValue != "")
                        objPedido.IdCliente = int.Parse(ddlCliente.SelectedValue);

                    if (txtDataVencimento.SelectedDate != null)
                    {
                        objPedido.dataVencimento = txtDataVencimento.SelectedDate;
                    }

                    objPedido.observacoes = txtObservacoes.Text;

                    if (txtValorTotal.Value != null)
                        objPedido.ValorTotal = (decimal)txtValorTotal.Value;

                    objPedido.Save();

                    AplicaCalculoPedido(objPedido.Id_Pedido);
                }

                RadWindowManager1.RadAlert("Operação realizada com sucesso", 0, 0, "Sucesso", "");

            }
            catch (Exception ex)
            {

                throw;
            }

        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            //Response.Redirect("~/Pages/ConsultaPedido.aspx");

            try
            {
                //Server.Transfer("~/Pages/ConsultaPedido.aspx");
                //pnlbtnBar.Redirect("~/ConsultaPedido.aspx");
                RadAjaxManager1.Redirect("~/ConsultaPedido.aspx");

            }
            catch (Exception ex)
            {

                throw ex;
            }


        }

        protected void grdProduto_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
        {
            int idPedido = 0;
            if (hdfIdPedido.Value != "")
            {
                idPedido = int.Parse(hdfIdPedido.Value);
            }

            PopulaProdutos(idPedido, true);
        }

        private void PopulaProdutos(int idPedido, bool rebind = false)
        {
            var lstProdutos = Domain.Model.VwProdutoPedido.All().Where(p => p.Id_Pedido == idPedido).ToList();

            grdProduto.DataSource = lstProdutos;
            if (!rebind) grdProduto.DataBind();

            if (idPedido > 0)
                AplicaCalculoPedido(idPedido);
        }

        private void PopulaServicos(int idPedido, bool rebind = false)
        {
            var lstServicos = Domain.Model.VwServicoPedido.All().Where(p => p.Id_Pedido == idPedido).ToList();

            grdServicos.DataSource = lstServicos;
            if (rebind) grdServicos.DataBind();

            if (idPedido > 0)
                AplicaCalculoPedido(idPedido);
        }


        protected void grdProduto_ItemCreated(object sender, GridItemEventArgs e)
        {
            //(this.grdProduto.MasterTableView.AutoGeneratedColumns[0] as GridBoundColumn).MaxLength = 5;

        }

        void PopulaDDlProdutos(ref DropDownList drop)
        {
            var lstProdutos = GetProdutos("");

            drop.Items.Add(new ListItem("Selecione", "0"));

            for (int i = 0; i < lstProdutos.Count; i++)
            {
                drop.Items.Add(new ListItem(lstProdutos[i].nome, lstProdutos[i].Id_Produto.ToString()));
            }

        }

        void ddlGridProduto_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList drop = (DropDownList)sender;

            if (drop.SelectedValue != "0")
            {
                object obj = drop.Parent;
                var produto = Domain.Model.Produto.SingleOrDefault(p => p.Id_Produto == int.Parse(drop.SelectedValue));

                if (produto != null)
                {

                }
            }
        }

        private static List<Domain.Model.Produto> GetProdutos(string text)
        {
            var lstProduto = Domain.Model.Produto.All().Where(c => (text.Trim().Length > 0 ? c.nome.Contains(text.Trim()) : true)).ToList();
            return lstProduto;
        }

        private static List<Domain.Model.Servico> GetServicos(string text)
        {
            var lstServicos = Domain.Model.Servico.All().Where(c => (text.Trim().Length > 0 ? c.descricao.Contains(text.Trim()) : true)).ToList();
            return lstServicos;
        }


        protected void ddlGridProduto2_TextChanged(object sender, EventArgs e)
        {

            DropDownList drop = (DropDownList)sender;

            GridEditFormItem editItem = (GridEditFormItem)drop.NamingContainer;

            //TextBox txtCodProduto = (TextBox)editItem.FindControl("txtCodProduto");     

            //GridEditCommandColumn editColumn = (GridEditCommandColumn)grdProduto.MasterTableView.GetColumn("codigoProduto");
            GridBoundColumn valor = (GridBoundColumn)grdProduto.MasterTableView.GetColumn("codigoProduto");

            if (drop.SelectedValue != "0")
            {
                object obj = drop.Parent;
                var produto = Domain.Model.Produto.SingleOrDefault(p => p.Id_Produto == int.Parse(drop.SelectedValue));

                if (produto != null)
                {
                    ((Telerik.Web.UI.GridTextBoxColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("codigoProduto"))).CurrentColumnEditor)).Text = produto.codigoProduto;
                    if (produto.IdFornecedor.HasValue)
                    {
                        GridDropDownColumnEditor ddlFornecedor = (GridDropDownColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("ddlNomeFornecedor"))).CurrentColumnEditor);

                        ddlFornecedor.SelectedValue = produto.IdFornecedor.ToString();
                    }
                }
            }
        }

        protected void ddlGridServico_TextChanged(object sender, EventArgs e)
        {

            DropDownList drop = (DropDownList)sender;

            GridEditFormItem editItem = (GridEditFormItem)drop.NamingContainer;

            //TextBox txtCodProduto = (TextBox)editItem.FindControl("txtCodProduto");     

            //GridEditCommandColumn editColumn = (GridEditCommandColumn)grdProduto.MasterTableView.GetColumn("codigoProduto");
            GridBoundColumn valor = (GridBoundColumn)grdProduto.MasterTableView.GetColumn("codigoProduto");

            if (drop.SelectedValue != "0")
            {
                object obj = drop.Parent;
                var produto = Domain.Model.Produto.SingleOrDefault(p => p.Id_Produto == int.Parse(drop.SelectedValue));

                if (produto != null)
                {
                    //editColumn.EditText = produto.codigoProduto;
                    ((Telerik.Web.UI.GridTextBoxColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("codigoProduto"))).CurrentColumnEditor)).Text = produto.codigoProduto;
                    //txtCodProduto.Text = produto.codigoProduto;
                }
            }
        }


        protected void grdProduto_UpdateCommand(object sender, GridCommandEventArgs e)
        {

            GridEditableItem item = e.Item as GridEditableItem;
            GridEditManager editMan = item.EditManager;

            GridNumericColumnEditor txtQt = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("quantidade"))).CurrentColumnEditor);
            GridDropDownListColumnEditor ddlFornecedor = editMan.GetColumnEditor("ddlNomeFornecedor") as GridDropDownListColumnEditor;
            GridNumericColumnEditor txtValor = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("valor"))).CurrentColumnEditor);

            GridNumericColumnEditor desconto = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("Desconto"))).CurrentColumnEditor);
            GridNumericColumnEditor altura = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("altura"))).CurrentColumnEditor);
            GridNumericColumnEditor largura = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("largura"))).CurrentColumnEditor);
            GridNumericColumnEditor espessura = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("espessura"))).CurrentColumnEditor);
            GridNumericColumnEditor profundidade = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("profundidade"))).CurrentColumnEditor);
            GridTextBoxColumnEditor cor = (GridTextBoxColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("cor"))).CurrentColumnEditor);


            //produto
            DropDownList drop = item.EditManager.GetColumnEditor("Id_Produto").ContainerControl.FindControl("ddlGridProduto") as DropDownList;
            int idProduto = 0;
            int idFornecedor = 0;
            int qt = 0;
            decimal valor = 0;

            if (drop.SelectedValue != "0")
            {
                idProduto = int.Parse(drop.SelectedValue);
            }

            //fornecedor            

            if (ddlFornecedor.SelectedValue != "")
            {
                idFornecedor = int.Parse(ddlFornecedor.SelectedValue);
            }

            //quantidade
            if (txtQt.NumericTextBox.Value > 0)
            {
                qt = (int)txtQt.NumericTextBox.Value;
            }

            //valor
            if (txtValor.NumericTextBox.Value > 0)
            {
                valor = (decimal)txtValor.NumericTextBox.Value;
            }

            //se o pedido existe, adiciona o item diretamente para produtopedido

            int idProdutoPedido = int.Parse(item.GetDataKeyValue("Id_ProdutoPedido").ToString());

            var prodPedido = Domain.Model.ProdutoPedido.SingleOrDefault(pe => pe.Id_ProdutoPedido == idProdutoPedido);

            prodPedido.Id_Fornecedor = idFornecedor;
            prodPedido.Id_Produto = idProduto;
            prodPedido.quantidade = (qt > 0 ? qt : 1);
            prodPedido.valor = valor;
            prodPedido.altura = altura.NumericTextBox.Value;
            prodPedido.largura = largura.NumericTextBox.Value;
            prodPedido.espessura = espessura.NumericTextBox.Value;
            prodPedido.profundidade = profundidade.NumericTextBox.Value;
            prodPedido.cor = cor.TextBoxControl.Text;

            prodPedido.desconto = (decimal)desconto.NumericTextBox.Value;
            prodPedido.Save();

            grdProduto.MasterTableView.ClearEditItems();
            grdProduto.EditIndexes.Clear();
            grdProduto.Rebind();
        }

        protected void grdProduto_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName == "Delete")
            {
                GridEditableItem item = e.Item as GridEditableItem;

                int idProdutoPedido = int.Parse(item.GetDataKeyValue("Id_ProdutoPedido").ToString());

                Domain.Model.ProdutoPedido.Delete(p => p.Id_ProdutoPedido == idProdutoPedido);

            }
        }

        protected void grdProduto_ItemDataBound(object sender, GridItemEventArgs e)
        {
            if (e.Item.IsInEditMode)
            {

                try
                {
                    GridEditableItem item = e.Item as GridEditableItem;

                    int idProduto = 0;

                    if (!string.IsNullOrEmpty(DataBinder.Eval(item.DataItem, "Id_Produto").ToString()))
                    {
                        idProduto = int.Parse(DataBinder.Eval(item.DataItem, "Id_Produto").ToString());
                    }

                    DropDownList drop = item.FindControl("ddlGridProduto") as DropDownList;
                    GridEditManager editMan = item.EditManager;

                    drop.Enabled = true;

                    drop.Items.Add(new ListItem("Selecione", "0"));

                    var lstProdutos = GetProdutos("");

                    for (int i = 0; i < lstProdutos.Count; i++)
                    {
                        drop.Items.Add(new ListItem(lstProdutos[i].nome, lstProdutos[i].Id_Produto.ToString()));
                    }

                    if (idProduto > 0)
                    {
                        drop.SelectedValue = idProduto.ToString();
                    }

                    GridDropDownListColumnEditor ddlFornecedor = editMan.GetColumnEditor("ddlNomeFornecedor") as GridDropDownListColumnEditor;
                    var lstFornecedor = Domain.Model.Fornecedor.All().ToList();

                    Domain.Model.Fornecedor fdefault = new Domain.Model.Fornecedor();

                    fdefault.nome = "Selecione";
                    lstFornecedor.Add(fdefault);

                    ddlFornecedor.DataSource = lstFornecedor;
                    ddlFornecedor.DataValueField = "Id_fornecedor";
                    ddlFornecedor.DataTextField = "nome";
                    ddlFornecedor.DataBind();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        protected void grdProduto_InsertCommand1(object sender, GridCommandEventArgs e)
        {
            GridEditableItem item = e.Item as GridEditableItem;
            GridEditManager editMan = item.EditManager;

            GridNumericColumnEditor txtQt = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("quantidade"))).CurrentColumnEditor);
            GridDropDownListColumnEditor ddlFornecedor = editMan.GetColumnEditor("ddlNomeFornecedor") as GridDropDownListColumnEditor;
            GridNumericColumnEditor txtValor = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("valor"))).CurrentColumnEditor);
            GridNumericColumnEditor desconto = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("Desconto"))).CurrentColumnEditor);
            GridNumericColumnEditor altura = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("altura"))).CurrentColumnEditor);
            GridNumericColumnEditor largura = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("largura"))).CurrentColumnEditor);
            GridNumericColumnEditor espessura = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("espessura"))).CurrentColumnEditor);
            GridNumericColumnEditor profundidade = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("profundidade"))).CurrentColumnEditor);
            GridTextBoxColumnEditor cor = (GridTextBoxColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdProduto.MasterTableView.GetColumn("cor"))).CurrentColumnEditor);

            //produto
            DropDownList drop = item.EditManager.GetColumnEditor("Id_Produto").ContainerControl.FindControl("ddlGridProduto") as DropDownList;
            int idProduto = 0;
            int idFornecedor = 0;
            int qt = 0;
            double? dDesconto = 0;
            double? dAltura = 0;
            double? dLargura = 0;
            double? dEspessura = 0;
            double? dProfundidade = 0;

            decimal valor = 0;

            if (drop.SelectedValue != "0")
            {
                idProduto = int.Parse(drop.SelectedValue);
            }

            //fornecedor            

            if (ddlFornecedor.SelectedValue != "")
            {
                idFornecedor = int.Parse(ddlFornecedor.SelectedValue);
            }

            //quantidade
            if (txtQt.NumericTextBox.Value > 0)
            {
                qt = (int)txtQt.NumericTextBox.Value;
            }

            //valor
            if (txtValor.NumericTextBox.Value > 0)
            {
                valor = (decimal)txtValor.NumericTextBox.Value;
            }

            //se o pedido existe, adiciona o item diretamente para produtopedido
            if (!string.IsNullOrEmpty(hdfIdPedido.Value))
            {
                Domain.Model.ProdutoPedido p = new ProdutoPedido();

                p.Id_Pedido = int.Parse(hdfIdPedido.Value);
                p.Id_Fornecedor = idFornecedor;
                p.Id_Produto = idProduto;
                p.quantidade = (qt > 0 ? qt : 1);
                p.valor = valor;
                p.altura = altura.NumericTextBox.Value;
                p.largura = largura.NumericTextBox.Value;
                p.espessura = espessura.NumericTextBox.Value;
                p.profundidade = profundidade.NumericTextBox.Value;
                p.cor = cor.TextBoxControl.Text;

                p.desconto = (decimal)desconto.NumericTextBox.Value;
                p.Save();

                grdProduto.MasterTableView.ClearEditItems();
                grdProduto.EditIndexes.Clear();
                grdProduto.Rebind();

                //grdProduto.MasterTableView.Rebind();
                //PopulaProdutos(int.Parse(hdfIdPedido.Value));
                //e.Item.Parent.Visible = false;

            }
            else
            {
                //se o pedido não existe, faz a inclusão
                //inclusão
                var objPedido = new Domain.Model.Pedido();

                objPedido.CodigoPedido = Util.Numerador("codigoPedido");

                if (!string.IsNullOrEmpty(ddlCliente.SelectedValue))
                {
                    objPedido.IdCliente = int.Parse(ddlCliente.SelectedValue);
                }

                objPedido.dataCadastro = DateTime.Now;

                if (txtDataVencimento.SelectedDate != null)
                {
                    objPedido.dataVencimento = txtDataVencimento.SelectedDate;
                }

                objPedido.observacoes = txtObservacoes.Text;

                if (txtValorTotal.Value != null)
                    objPedido.ValorTotal = (decimal)txtValorTotal.Value;

                objPedido.Save();

                var status = Domain.Model.Status.SingleOrDefault(s => s.P_status == "Pendente");

                //////////////////////////////////

                if (!Domain.Model.StatusPedido.Exists(s => s.Id_Pedido == objPedido.Id_Pedido))
                {
                    //inclui status do pedido
                    Domain.Model.StatusPedido statusPedido = new StatusPedido();

                    statusPedido.Id_Pedido = objPedido.Id_Pedido;
                    statusPedido.Id_Status = status.Id_Status;
                    statusPedido.data = DateTime.Now;
                    statusPedido.motivo = "Inclusão do pedido no sistema";
                    statusPedido.Save();
                }

                if (!Domain.Model.ContaReceber.Exists(s => s.Id_Pedido == objPedido.Id_Pedido))
                {

                    //inclui pedido em contas a receber
                    var contaReceber = new Domain.Model.ContaReceber();

                    contaReceber.Id_Pedido = objPedido.Id_Pedido;
                    contaReceber.Save();
                }

                hdfIdPedido.Value = objPedido.Id_Pedido.ToString();

                Domain.Model.ProdutoPedido p = new ProdutoPedido();

                p.Id_Pedido = objPedido.Id_Pedido;
                p.Id_Fornecedor = idFornecedor;
                p.Id_Produto = idProduto;
                p.quantidade = (qt > 0 ? qt : 1);
                p.valor = valor;
                p.altura = altura.NumericTextBox.Value;
                p.largura = largura.NumericTextBox.Value;
                p.espessura = espessura.NumericTextBox.Value;
                p.profundidade = profundidade.NumericTextBox.Value;
                p.cor = cor.TextBoxControl.Text;
                p.desconto = (decimal)desconto.NumericTextBox.Value;
                p.Save();
            }

        }

        protected void grdServicos_UpdateCommand(object sender, GridCommandEventArgs e)
        {

            GridEditableItem item = e.Item as GridEditableItem;
            GridEditManager editMan = item.EditManager;

            GridNumericColumnEditor txtValor = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdServicos.MasterTableView.GetColumn("valor"))).CurrentColumnEditor);
            GridNumericColumnEditor txtDesconto = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdServicos.MasterTableView.GetColumn("Desconto"))).CurrentColumnEditor);

            //Servico
            DropDownList drop = item.EditManager.GetColumnEditor("Id_Servico").ContainerControl.FindControl("ddlGridServico") as DropDownList;
            int idServicoPedido = int.Parse(item.GetDataKeyValue("Id_SevicoPedido").ToString());
            int idServico = 0;

            decimal valor = 0, desconto = 0;

            if (drop.SelectedValue != "0")
            {
                idServico = int.Parse(drop.SelectedValue);
            }

            //valor
            if (txtValor.NumericTextBox.Value > 0)
            {
                valor = (decimal)txtValor.NumericTextBox.Value;
            }

            //desconto
            if (txtDesconto.NumericTextBox.Value > 0)
            {
                desconto = (decimal)txtDesconto.NumericTextBox.Value;
            }

            var solicitacao = Domain.Model.ServicoPedido.SingleOrDefault(s => s.Id_SevicoPedido == idServicoPedido);

            solicitacao.Id_Servico = idServico;
            solicitacao.Desconto = desconto;
            solicitacao.valor = valor;
            solicitacao.Save();

            grdServicos.MasterTableView.ClearEditItems();
            grdServicos.EditIndexes.Clear();
            grdServicos.Rebind();

        }
        protected void grdServicos_InsertCommand(object sender, GridCommandEventArgs e)
        {
            GridEditableItem item = e.Item as GridEditableItem;
            GridEditManager editMan = item.EditManager;

            GridNumericColumnEditor txtValor = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdServicos.MasterTableView.GetColumn("valor"))).CurrentColumnEditor);
            GridNumericColumnEditor txtDesconto = (GridNumericColumnEditor)(((Telerik.Web.UI.GridEditableColumn)(grdServicos.MasterTableView.GetColumn("Desconto"))).CurrentColumnEditor);

            //Servico
            DropDownList drop = item.EditManager.GetColumnEditor("Id_Servico").ContainerControl.FindControl("ddlGridServico") as DropDownList;
            int idProduto = 0;
            int qt = 0;
            decimal valor = 0, desconto = 0;

            if (drop.SelectedValue != "0")
            {
                idProduto = int.Parse(drop.SelectedValue);
            }

            //quantidade
            if (txtValor.NumericTextBox.Value > 0)
            {
                valor = (decimal)txtValor.NumericTextBox.Value;
            }

            //valor
            if (txtDesconto.NumericTextBox.Value > 0)
            {
                desconto = (decimal)txtDesconto.NumericTextBox.Value;
            }

            //se o pedido existe, adiciona o item diretamente para servicopedido
            if (!string.IsNullOrEmpty(hdfIdPedido.Value))
            {
                Domain.Model.ServicoPedido s = new ServicoPedido();

                s.Id_Pedido = int.Parse(hdfIdPedido.Value.ToString());

                if (drop.SelectedValue != "")
                {
                    s.Id_Servico = int.Parse(drop.SelectedValue);
                }
                s.Desconto = desconto;
                s.valor = valor;
                s.Save();

                grdServicos.MasterTableView.ClearEditItems();
                grdServicos.EditIndexes.Clear();
                grdServicos.Rebind();

            }
            else
            {
                //se o pedido não existe, faz a inclusão
                //inclusão
                var objPedido = new Domain.Model.Pedido();

                objPedido.CodigoPedido = Util.Numerador("codigoPedido");

                if (!string.IsNullOrEmpty(ddlCliente.SelectedValue))
                {
                    objPedido.IdCliente = int.Parse(ddlCliente.SelectedValue);
                }

                objPedido.dataCadastro = DateTime.Now;

                if (txtDataVencimento.SelectedDate != null)
                {
                    objPedido.dataVencimento = txtDataVencimento.SelectedDate;
                }

                objPedido.observacoes = txtObservacoes.Text;

                if (txtValorTotal.Value != null)
                    objPedido.ValorTotal = (decimal)txtValorTotal.Value;

                objPedido.Save();
                hdfIdPedido.Value = objPedido.Id_Pedido.ToString();

                var status = Domain.Model.Status.SingleOrDefault(s => s.P_status == "Pendente");

                if (!Domain.Model.StatusPedido.Exists(s => s.Id_Pedido == objPedido.Id_Pedido))
                {
                    //inclui status do pedido
                    Domain.Model.StatusPedido statusPedido = new StatusPedido();

                    statusPedido.Id_Pedido = objPedido.Id_Pedido;
                    statusPedido.Id_Status = status.Id_Status;
                    statusPedido.data = DateTime.Now;
                    statusPedido.motivo = "Inclusão do pedido no sistema";
                    statusPedido.Save();
                }

                if (!Domain.Model.ContaReceber.Exists(s => s.Id_Pedido == objPedido.Id_Pedido))
                {

                    //inclui pedido em contas a receber
                    var contaReceber = new Domain.Model.ContaReceber();

                    contaReceber.Id_Pedido = objPedido.Id_Pedido;
                    contaReceber.Save();
                }

                Domain.Model.ServicoPedido serv = new ServicoPedido();
                serv.Id_Pedido = objPedido.Id_Pedido;

                if (drop.SelectedValue != "")
                {
                    serv.Id_Servico = int.Parse(drop.SelectedValue);
                }
                serv.Desconto = desconto;
                serv.valor = valor;
                serv.Save();

                grdServicos.MasterTableView.ClearEditItems();
                grdServicos.EditIndexes.Clear();
                grdServicos.Rebind();

            }
        }

        protected void grdServicos_ItemCommand(object sender, GridCommandEventArgs e)
        {

            if (e.CommandName == "Delete")
            {
                GridEditableItem item = e.Item as GridEditableItem;

                int idServicoPedido = int.Parse(item.GetDataKeyValue("Id_SevicoPedido").ToString());

                Domain.Model.ServicoPedido.Delete(p => p.Id_SevicoPedido == idServicoPedido);

            }

        }

        protected void grdServicos_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
        {
            int idPedido = 0;
            if (hdfIdPedido.Value != "")
            {
                idPedido = int.Parse(hdfIdPedido.Value);
            }

            PopulaServicos(idPedido, false);
        }

        protected void grdServicos_ItemUpdated(object source, Telerik.Web.UI.GridUpdatedEventArgs e)
        {

        }

        protected void grdServicos_DataBound(object sender, EventArgs e)
        { }

        protected void grdServicos_ItemDeleted(object source, GridDeletedEventArgs e)
        { }


        protected void grdServicos_ItemInserted(object source, GridInsertedEventArgs e)
        {


        }

        protected void grdServicos_ItemDataBound(object sender, GridItemEventArgs e)
        {
            if (e.Item.IsInEditMode)
            {
                GridEditableItem item = e.Item as GridEditableItem;

                int idServico = 0;

                if (!string.IsNullOrEmpty(DataBinder.Eval(item.DataItem, "Id_Servico").ToString()))
                {
                    idServico = int.Parse(DataBinder.Eval(item.DataItem, "Id_Servico").ToString());
                }

                DropDownList drop = item.FindControl("ddlGridServico") as DropDownList;
                GridEditManager editMan = item.EditManager;

                drop.Enabled = true;

                drop.Items.Add(new ListItem("Selecione", "0"));

                var lstServico = GetServicos("");

                for (int i = 0; i < lstServico.Count; i++)
                {
                    drop.Items.Add(new ListItem(lstServico[i].tipo, lstServico[i].Id_Servico.ToString()));
                }

                if (idServico > 0)
                {
                    drop.SelectedValue = idServico.ToString();
                }
            }
        }

        void AplicaCalculoPedido(int idPedido)
        {

            var vlTotalProdutos = Domain.Model.ProdutoPedido.All().Where(p => p.Id_Pedido == idPedido).Sum(p => p.valor * p.quantidade).GetValueOrDefault(0);
            var vlDescontoProdutos = Domain.Model.ProdutoPedido.All().Where(p => p.Id_Pedido == idPedido).Sum(p => p.desconto * p.quantidade).GetValueOrDefault(0);

            var vlTotalServicos = Domain.Model.ServicoPedido.All().Where(p => p.Id_Pedido == idPedido).Sum(p => p.valor - p.Desconto).GetValueOrDefault(0);

            var pedido = Domain.Model.Pedido.SingleOrDefault(p => p.Id_Pedido == idPedido);

            pedido.ValorTotal = (vlTotalProdutos - vlDescontoProdutos) + vlTotalServicos;

            pedido.Save();

            this.txtValorTotal.Value = (double)pedido.ValorTotal.Value;
        }

    }
}